小茶最近忙壞了~有點累累
看了虎虎大大說文章中說到工作之餘還是要注意身體(明明就自己愛玩),所以約了朋友一起去爬象山,但...我還是背了筆電去爬 呢!超瞎。
大家要多出去動一動唷,送給你們從攝手平台拍的霧霧的 101 風景!
回到正題,接下來幾天我們讓來討論一些常見的攻擊行為,有心者常常會利用各種程式或安全性漏洞,藉以攻擊或入侵伺服器以達到想達到的目的,像是使系統癱瘓、取得系統控制權、竊取使用者重要資訊或進行網路竊聽(收集網路使用資訊)等等,其中一項普遍常見的攻擊方式為緩衝區溢位(Buffer Overflow),讓我們來探討 Buffer Overflow 的概念吧。
緩衝區溢位 Buffer Overflow
在一般使用 C 或 C++ 等語言編成的程式在使用到固定大小的緩衝區進行資料存取時並不會自己進行緩衝區邊界的檢查,在一般正常使用情況,輸入值(Input data)會小於緩衝區的大小(Buffer size)。
若程式設計者在設計讀取輸入值至緩衝區時也忽略了檢查輸入值長度時,攻擊者就可以透過輸入一筆較長的資料,以造成程式癱瘓或改變執行流程,通常會搭配 Shellcode 可以執行任意程式碼,而且同時擁有受害程式的權限。
如上圖所示,當輸入值過長且又沒去檢查是否超過緩衝區長度時,則會使得輸入值覆寫掉一些存在 stack 中的訊息,如圖中的 Return address,當這個存放程式 Call back 位址的 Return address 被修改後,將可能因為寫入的值而導致系統癱瘓或被導向攻擊者寫入 Shellcode 的位址
但首先要進行 Buffer Overflow 攻擊前,攻擊者必須精準知道 Buffer 大小、Return address、各個暫存器的值,但這些值通常會根據不同電腦架構或作業系統而有所不同,所以不見得會攻擊成功。
最簡單的例子就是函式 strcpy(est ,src),因其不檢查輸入長度,所以很容易造成緩衝區溢位,不過現在程式設計師都會以 strncpy 取而代之。
假設此時宣告 char buffer[24],再呼叫 strcpy(Buffer,Input),當 Input 大於 24 就有機會覆寫到原 Stack 中所存放的值,包含暫存器 EIP、EBP 等,就會影響到 Return address 而改變程式執行流程。
我們可以透過 Ollydbg 等 Debugger 觀察程式的執行流程、暫存器值和 Stack 內容,如下圖可以看到在經過 strcpy 輸入一長串 Input data 後,將造成不可預期的影響。
除了在設計程式時應該謹慎考慮,我們也可以在 IPS/IDS 入侵防禦上檢查並丟棄此類型封包,達到保護系統的目的。
而 Shellcode 就是一堆十六進位的代碼組合而成,可以直接被 CPU 辨識執行,通常會透過 Buffer Overflow 改變程式執行流程到攻擊者存放在記憶體的 Shellcode,就可以為所欲為了,像是透過下面的程式碼以 xor 計算去改變 EBP 的值。
00000000: C7C566666666 mov ebp, 066666666
00000006: C7C111111111 mov ecx, 011111111
0000000C: 33E9 xor ebp, ecx
0000000E: 42 inc edx
0000000F: 50 push eax
在種種的攻擊手段中,Buffer Overflow 是較為老舊的攻擊方式,已經許久不在 OWASP Top 10 名單中,但在 Common Vulnerabilities and Exposures(CVE)所公布的漏洞報告,依然屬於攻擊手法的常客。想要避免成為被攻擊的目標,可以使用以下方式:
splint 官網
http://www.splint.org/
希望有興趣的讀者也能夠點個追蹤,有任何問題或有想多了解的地方也可以回覆在文章底下唷,謝謝你們XDDDD!
參考來源:
OWASP https://www.owasp.org/index.php/Main_Page
CVE https://cve.mitre.org/
宅學習-Buffer Overflow 筆記 by blind332 http://sls.weco.net/blog/blind332/08-jan-2010/14154
爬山好健康哦 =v=+
貓咪也好療癒喔 XD
話說,緩衝區溢位最常的出錯的部份是藍色畫面吧 XDDDD
呵呵 對壓 XD
好久沒有爬山了~
虎爸還好嗎?
謝謝關心,他很好哦~
應該過著幸福快樂的日子吧?!
茶茶大大也要好好保重身體哦 :)
原來台北的霾害這麼嚴重?!
出去走走真的OK嗎?
牛哥~
我看昨天的 pm2.5 還不算太嚴重啦 XDD,所以就熱血一波了
但還是霧霧的~
1/9 別外出 XDDD,因為
typo: "再呼叫 strcpyd(Buffer,Input)"
感謝shinypichu88大大的回報!!已修正囉